<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Document</title>
</head>
<body>
	<script type="text/javascript">
	/*
		总结：
			1.类中的构造器不是必须写的，要对实例进行一个写初始化的操作、如添加指定属性时才写；
			2.如果A类集成了B类，且A类中写了构造器，那么S类的构造器中必须写super()
			3.类中定义的方法放在了原型上，供类的实例对象使用
	*/

	// 创建一个Person类
		class Person {
			// 构造器方法
			constructor(name, age){
				// 构造器中的this是类的实例对象
				this.name = name
				this.age = age
			}
			// 一般方法 —— 方法会放在原型对象上，供实例使用
			speak(){
				// 通过Person的实例调用speak，那么speak中的this指向就是Person的实例
				console.log(`我叫${this.name}，今年${this.age}岁`);	
			}
		}

		// 创建一个Student类，集成Person类
		class Student extends Person {
			constructor(name, age, grade){
				super(name, age) 
				this.grade = grade
			}
			// 一般方法 —— 方法会放在原型对象上，供实例使用
			speak(){
				// 通过Person的实例调用speak，那么speak中的this指向就是Person的实例
				console.log(`我叫${this.name}，今年${this.age}岁，现在就读${this.grade}`);	
			}
			study(){
				console.log('我很努力的学习');
			}
		}

		const p1 = new Person('橘子', 18)
		const p2 = new Person('juehm', 20)
		// p1、p2是Person类的实例对象
		console.log(p1);
		console.log(p2);
		p1.speak()
		p2.speak()

		const s1 = new Student('Orange', 22, '大学')
		console.log(s1);
		s1.speak()
		s1.study()
	</script>
</body>
</html>